package com.itheima.stargraph.interceptor;

import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.messaging.support.MessageHeaderAccessor;

import java.security.Principal;
import java.util.List;
//定义一个用户和管道之间关系的拦截器
@Slf4j
public class WebscoketUserInterceptor implements ChannelInterceptor {

     /**
     * 在消息发送之前拦截
     * @param message 原始消息
     * @param channel 管道
     * @return
     */
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        //1.从消息中获取STOMP头部消息
        StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        //2.非空判断，如果消息是一个STOMP connect命令
        if (accessor!=null && accessor.getCommand().equals(StompCommand.CONNECT)) {
            //从原生头部信息中获取名为clientId的值
            List<String> clientIds = accessor.getNativeHeader("clientId");
            //如果集合不为空，则表示clientId存在
            if (CollUtil.isNotEmpty(clientIds)) {
                String clientId = clientIds.get(0);
                //设置用户为一个实现了Principal接口的匿名实例
                //这个用户的名称就是clientIds列表中的第一个元素
                accessor.setUser(new Principal() {
                    @Override
                    public String getName() {
                        //获取客户端的id
                        log.info("拦截器获取到的客户端ID：{}", clientId);
                       return clientId;
                    }
                });
            }
        }
        //如果为空和不是STOMP connect命令，则返回原始消息
        return message;
    }
}